package util

import (
	"fmt"
	consulApi "github.com/hashicorp/consul/api"
	"github.com/google/uuid"
)

var consulClient *consulApi.Client
var serviceID string
var serviceName string
var ServicePort int
func init() {
	// 1.创建注册客户端
	config := consulApi.DefaultConfig()
	config.Address = "127.0.0.1:8500"
	_consulClient, err := consulApi.NewClient(config)
	if err != nil {
		panic(err)
		return
	}
	consulClient = _consulClient

	serviceID = fmt.Sprintf("userService%s", uuid.New().String())// /因为最终这段代码是在不同的机器上跑的，是分布式的，有好几台机器提供相同的server，所以这里存到consul中的id必须是唯一的，否则只有一台服务器可以注册进去，这里使用uuid保证唯一性
}

func SetServiceNameAndPort(name string, port int) {
	serviceName = name
	ServicePort = port
}

// ServiceRegister 服务注册
func ServiceRegister() {
	// 1.服务配置
	reg := consulApi.AgentServiceRegistration{}

	reg.ID = serviceID	//设置不同的Id，即使是相同的service name也得有不同的id
	reg.Name = serviceName //注册service的名字
	reg.Address = "127.0.0.1" //注册service的ip
	reg.Port = ServicePort //注册service的端口
	reg.Tags = []string{"primary"}

	// 2.设置健康检查
	check := consulApi.AgentServiceCheck{}
	check.Interval = "5s"
	check.HTTP = fmt.Sprintf("http://%s:%d/health", reg.Address, ServicePort)//"http://127.0.0.1:8080/health"

	// 3.添加检查
	reg.Check = &check

	// 4.注册服务
	err := consulClient.Agent().ServiceRegister(&reg)
	if err != nil {
		panic(err)
		return
	}
	// http://106.13.184.120:8500/ui/dc1/services 服务面板
	// http://127.0.0.1:8500/v1/agent/services	查看注册服务
}


// ServiceDeregister 服务注销
func ServiceDeregister()  {
	consulClient.Agent().ServiceDeregister(serviceID)
}